<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //创建对象的四种方式
        // 1.字面量
        var obj = {
            name : '张三'
        }
        // 内置构造函数
        var obj = new Object();
        obj.name = "张三";

        // 工厂模式
        function Factory(name,age){
            var obj ={};
            obj.name = name ;
            obj.age = age ;
            return obj;
        }
        var obj = Factory("张三", 20);

        // 自定义构造函数
        function Person(name,age){
            this.name = name;
            this.age = age ;
            return{
                name :"123"
            }
        }

        Person.prototype.fn = function(){
            console.log("fn...");
        }

        // 1.创建一个空对象
        // 2.this指向这个空对象
        // 3.对象的隐式原型执行函数的原型
        // 4.隐式返回这个对象,返回this


        function mynew(name,age){
            var obj = {};
            // call方法改变this指向及赋予属性
            var res = Person.call(obj,name,age);
            // 把obj的隐式原型挂载到Person的原型上
            obj.__proto__ = Person.prototype;
            if(typeof res == 'undefined'){
                return obj;
            }else{
                return res;
            }
        }
        var zhangsan = mynew("张三",20);
        console.log(zhangsan);



    </script>
</body>
</html>